package com.tencent.sr.iris.activity.service.config;

import cn.hutool.core.collection.CollectionUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.tencent.sr.iris.activity.common.util.TimeUtils;
import com.tencent.sr.iris.activity.interfaces.dto.ActivityComponentTextDTO;
import com.tencent.sr.iris.activity.interfaces.dto.MultiTaskActivityDTO;
import com.tencent.sr.tech.dynamic.config.spring.annotation.DynamicConfigObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 活动七彩石配置
 *
 * @author xiaojun
 */
@Data
@Slf4j
@Component
@DynamicConfigObject(key = "activityConfig")
public class ActivityConfig {


    /**
     * 测试用户白名单
     */
    public List<String> testUidWhiteList = Lists.newArrayList();

    /**
     * 云选新用户白名单
     */
    public List<String> yunXuanUidWhiteList = Lists.newArrayList();

    /**
     * 升级有礼，见习->初级黑名单
     */
    public List<String> levelUpMemeberBlackList = Lists.newArrayList();


    /**
     * 活动的普通用户开始参与时间
     */
    private String actRealUserStartTime = "2023-03-01 00:00:00";


    /**
     * 注册有礼结束时间
     */
    private String registGiftEndTime = "2023-09-01 00:00:00";

    /**
     * 特邀结束时间
     */
    private String specialInviteEndTime = "2023-09-01 00:00:00";

    /**
     * 严格口径生效时间
     */
    private String strictStandardStartTime = "2023-05-01";

    /**
     * 佣金任务结束后多少天算任务最终结束，测试用，只有白名单用户生效
     */
    private int commissionTaskPlusDay;


    /**
     * 活动类型和id映射
     */
    public Map<String, String> actTaskId = Maps.newHashMap();

    /**
     * 月月领活动ID
     */
    private String monthGiftActivityId;
    /**
     * 注册有礼活动ID
     */
    private String registGiftActivityId;
    /**
     * 邀请有礼活动ID
     */
    private String inviteGiftActivityId;
    /**
     * 升级有礼(培育奖)活动ID
     */
    private String levelUpFosterActivityId;
    /**
     * 升级有礼(晋升奖)活动ID
     */
    private String levelUpPromoActivityId;
    /**
     * 特邀邀请有礼活动id
     */
    private String specialInviteGiftActivityId;

    /**
     * 辅导津贴活动id
     */
    private String guideAllowanceActivityId;

    /**
     * 多任务活动配置, key:activity_type，value:配置信息
     */
    private Map<String, MultiTaskActivityDTO> multiTaskActivityConfig = Maps.newHashMap();

    /**
     * 多阶段任务taskId配置
     */
    private List<String> singleTaskInMultiActivity = Collections.emptyList();

    /**
     * 限额任务配置 key：activityId，value：taskId
     */
    private Map<String, List<String>> limitedActivity = Collections.emptyMap();

    /**
     * 等级维度邀请限额，key为等级id
     */
    private Map<String, Integer> levelInviteLimitConfig = Maps.newHashMap();

    /**
     * 等级维度按月邀请限额，key为等级id+yyyyMM
     */
    private Map<String, Integer> levelInviteLimitMap = Maps.newHashMap();


    /**
     * 活动对应的文案配置
     * 例：INVITE_GMV_TASK,好友升级会员您可得¥{amount}
     */
    private Map<String, String> bizIdDescMap = Maps.newHashMap();

    /**
     * 活动组件文案
     */
    private Map<String, Map<String, List<ActivityComponentTextDTO>>> activityComponentText = Maps.newHashMap();

    /**
     * 是否停止执行全量推送注册有礼优惠券
     */
    private boolean stopPushAllUserBecomeTrainee = false;


    /**
     * 是否停止刷pid
     */
    private boolean stopFreshPid = false;


    /**
     * 是否停止刷gmv
     */
    private boolean stopFreshGmv = false;


    /**
     * 监控队列是否停止
     */
    private boolean awardQueueStop = false;

    /**
     * 监控队列延时（秒）
     */
    private long awardQueueDelaySeconds = 5 * 60;

    /**
     * 是否延迟查询用户升级场景标签
     *
     * @return
     */
    private boolean delayQueryUserTag = false;

    /**
     * 延迟多少秒查询用户升级场景标签
     */
    private int delayQueryUserTagSeconds = 4;

    /**
     * 分销单消息投递topic隔离
     */
    private boolean orderMsgTopicChange = true;

    /**
     * 0706版本开始时间
     */
    private String v0706StartTime = "2023-07-06 00:00:00";

    /**
     * 未完成的任务状态兜底处理（处理坑位被占完的时候其他的受限状态设置失败的场景）
     */
    private boolean handleInviteTaskStatusStop = true;

    /**
     * 成为见习升级等待时间
     */
    private long queryWaitTime = 1000l;


    /**
     * 是否启用新上级等级准入（依赖用户刷数。需刷完数再切换新准入规则）
     *
     * @return
     */
    private boolean useNewPidLevel = false;

    /**
     * 是否或略今日已弹窗，继续弹窗
     *
     * @return
     */
    private boolean ignoreTodayPop = false;

    /**
     * 不管活动记录是否新建，都更新任务记录的活动记录id
     *
     * @return
     */
    private boolean alwaysUpdateActivityRecordId = true;

    /**
     * 关闭同步跑批消息消费逻辑
     * @return
     */
    private boolean syncBatchDataStop = false;

    /**
     * 发奖重试往前最大天数
     * @return
     */
    private Integer awardRetryMaxDays = 30;

    /**
     * 发奖重试最大循环次数
     * @return
     */
    private Integer awardRetryMaxLoopTimes = 10;

    /**
     * 发奖确认开关
     * @return
     */
    private Boolean awardConfirmOn = true;

    /**
     * 校验是否已有发奖记录
     * @return
     */
    private boolean validateAwardSent = true;

    /**
     * 邀请有礼首单发奖切换时间
     */
    private String firstOrderAwardChangeDate = "2023-10-31 23:59:59";

    /**
     * 从活动记录统计发奖次数
     */
    private boolean countAwardFromActivityRecord = true;

    public Long getActRealUserStartTimestamp() {
        return TimeUtils.parse(this.actRealUserStartTime).getTime();
    }

    public Long getRegistGiftEndTimeTimestamp() {
        return TimeUtils.parse(this.registGiftEndTime).getTime();
    }

    public Long getSpecialInviteEndTimeTimestamp() {
        return Objects.requireNonNull(TimeUtils.parse(this.specialInviteEndTime)).getTime();
    }

    /**
     * 获取uid对应的分销任务的结束时间延迟日期默认60天，如果命中白名单，走白名单的天数
     *
     * @param uid
     * @return
     */
    public int getCommissionPlusDays(String uid) {
        int plusDays = 60;
        //如果命中测试白名单，任务最终结束时间走七彩石配置
        if (CollectionUtil.isNotEmpty(testUidWhiteList)
                && testUidWhiteList.contains(uid)) {
            plusDays = commissionTaskPlusDay;
        }
        return plusDays;
    }

    /**
     * 获取严格口径生效时间
     *
     * @param uid
     * @return
     */
    public String getStrictStandardStartTimeByUid(String uid) {
        //如果命中测试白名单，任务最终结束时间走七彩石配置
        if (CollectionUtil.isNotEmpty(testUidWhiteList)
                && testUidWhiteList.contains(uid)) {
            return strictStandardStartTime;
        }
        return "2023-05-01";
    }
}
